package Bean;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Author czl
 * @Date 2024-03-27
 */
public class BeanUtil1 {
    public static void setProperty(Object bean, String propertyName, Object value) throws Exception{

        //方法一：
        PropertyDescriptor propertyDescriptor = new PropertyDescriptor(propertyName, bean.getClass());

        Method writeMethod = propertyDescriptor.getWriteMethod();

        writeMethod.invoke(bean,value);


        //方法二:
//        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);
//
//        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
//
//        for (PropertyDescriptor descriptor : propertyDescriptors) {
//            if (descriptor.getName().equals(propertyName)){
//                descriptor.getWriteMethod().invoke(bean,value);
//                break;
//            }
//        }


    }
    public static Object getProperty(Object bean, String propertyName) throws Exception{

        //方法一:
        PropertyDescriptor propertyDescriptor = new PropertyDescriptor(propertyName, bean.getClass());

        Method writeMethod = propertyDescriptor.getReadMethod();

        return writeMethod.invoke(bean);


        //方法二：
         // 第一：获取 Java Bean 对象的 BeanInfo 对象 - 排除父类
//        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);
//
//        // 第二：获取属性描述器列表
//        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
//
//        // 第三：循环遍历所有的属性描述器 - 匹配取值的属性，找到 getter 方法 - 调用返回属性值
//
//        for (PropertyDescriptor descriptor : propertyDescriptors) {
//            if (descriptor.getName().equals(propertyName)) {
//                return descriptor.getReadMethod().invoke(bean);
//            }
//        }
//        return null ;
    }


    public static void copyProperties(Object source, Object target) throws Exception{

        // 第一：获取源对象的 BeanInfo 对象
        BeanInfo beanInfo = Introspector.getBeanInfo(source.getClass(), Object.class);

        // 第二：获取源对象的属性描述器列表 - 循环遍历 - 获取属性名称及其值 - 根据属性名称创建属性描述器对象 - 获取 setter 方法，调用赋值
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
            // 1.获取源对象的属性名称
            String propertyName = propertyDescriptor.getName();
            // 2.获取源对象的属性值
            Object propertyValue = propertyDescriptor.getReadMethod().invoke(source);
            // 3.根据源对象的属性名称，创建目标对象的属性描述器对象
            PropertyDescriptor targetPropertyDescriptor = new PropertyDescriptor(propertyName,target.getClass()) ;
            // 4.获取目标对象的 setter 方法，调用赋值
            targetPropertyDescriptor.getWriteMethod().invoke(target,propertyValue);
        }
    }
}
